package main

import (
	"flag"
	"os"
	"os/signal"
	"syscall"

	"go_gateway/dao"
	"go_gateway/golang_common/lib"
	"go_gateway/grpc_proxy_router"
	"go_gateway/http_proxy_router"
	"go_gateway/router"
	"go_gateway/tcp_proxy_router"
)

//endpoint dashboard后台管理  server代理服务器
//config ./conf/prod/ 对应配置文件夹

var (
	endpoint = flag.String("endpoint", "", "input endpoint dashboard or server")
	config   = flag.String("config", "", "input config file like ./conf/dev/")
)

func main() {
	flag.Parse() // 解析命令行参数
	// flag.String() 返回的是 指针类型 (*string)，需要解引用获取值
	if *endpoint == "" {
		flag.Usage() // 显示命令行参数正确用法
		os.Exit(1)
	}
	if *config == "" {
		flag.Usage()
		os.Exit(1)
	}

	if *endpoint == "dashboard" {
		lib.InitModule(*config)
		defer lib.Destroy() //延迟执行
		router.HttpServerRun()

		quit := make(chan os.Signal)
		// 设置信号监听，系统在收到这些信号时发送到 quit 通道
		signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
		// 阻塞等待退出信号执行后续的逻辑
		<-quit

		//SIGINT (信号值 2)：终端中断信号(用户主动终止)，通常是 Ctrl+C
		//SIGTERM (信号值 15)：终止信号(系统请求退出)，通常由 kill <pid> 命令发送

		// 优雅关闭
		router.HttpServerStop()
	} else {
		lib.InitModule(*config)
		defer lib.Destroy()

		//一次性加载所有服务/租户配置数据
		dao.ServiceManagerHandler.LoadOnce() //服务
		dao.AppManagerHandler.LoadOnce()     //租户

		// 并行启动所有代理服务（非阻塞）
		go func() {
			http_proxy_router.HttpServerRun()
		}()
		go func() {
			http_proxy_router.HttpsServerRun()
		}()
		go func() {
			tcp_proxy_router.TcpServerRun()
		}()
		go func() {
			grpc_proxy_router.GrpcServerRun()
		}()

		//主 goroutine 在这里等待终止信号
		quit := make(chan os.Signal)
		signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
		<-quit

		// 优雅停止所有服务
		tcp_proxy_router.TcpServerStop()
		grpc_proxy_router.GrpcServerStop()
		http_proxy_router.HttpServerStop()
		http_proxy_router.HttpsServerStop()
	}
}
